oralce 常用函数

1.单行函数


  function_name(column|expression,[arg1,arg2,...])


-接收参数并返回一个结果
-每行返回一个结果
-可以改变数据类型
-能被嵌套
-可以用于SELECT,WHERE和ORDER BY子句
-包括:字符函数,数值函数,日期函数,转换函数,通用函数

 

2.字符函数


-包括:大小写转换函数,字符处理函数

 

1)大小写转换函数

  
         函数                       结果
  LOWER('SQL Course')            sql course
  UPPER('SQL Course')            SQL COURSE
  INITCAP('SQL Course')          Sql Course

 

例:

SELECT empno,ename,deptno
FROM   emp
WHERE  ename=UPPER('blake');

 

结果:
       EMPNO  ENAME  DEPTNO 
       7698   BLAKE    30 

 

2)字符串处理函数
 
        函数                          结果
   CONCAT('Good','String')            GoodString
   SUBSTR('String',1,3)               Str
   LENGTH('String')                   6
   INSTR('String','r')                3
   LPAD(sal,10,'*')                   ******5000 
   RPAD(sal,10,'*')                   5000******
   TRIM('S' FROM 'SSMITH')            MITH
 
例:

SELECT ename,CONCAT(ename,job),LENGTH(ename),INSTR(ename,'A')
FROM   emp
WHERE  SUBSTR(job,1,5)='SALES';

结果:
       ENAME   CONCAT(ENAME,JOB)  LENGTH(ENAME) INSTR(ENAME,'A') 
       ALLEN   ALLENSALESMAN            5             1 
       WARD    WARDSALESMAN             4             2 
       MARTIN  MARTINSALESMAN           6             2 
       TURNER  TURNERSALESMAN           6             0 


3.数值函数


1) ROUND:四舍五入到指定的小数位
  -ROUND(45.926,2)      45.93
  
例:

SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1)
FROM   dual;
  
结果:
        ROUND(45.923,2)  ROUND(45.923,0)  ROUND(45.923,-1) 
                 45.92                          46                              50
 

2)TRUNC:截取到指定的小数位


  -TURNC(45.926)         45.92

 

例:

SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,0)

FROM   dual;
  
结果:

        TRUNC(45.923,2)  TRUNC(45.923,0)  TRUNC(45.923,-1) 
                 45.92                           45                            40

 

3)MOD:取余数

 

MOD(1600,300)         100

例:

SELECT ename,sal,comm,MOD(sal,comm)
FROM   emp
WHERE  job='SALESMAN';
结果:
        ENAME   SAL    COMM  MOD(SAL,COMM) 
        ALLEN   1600   300         100 
        WARD    1250   500         250 
        MARTIN  1250   1400        1250 
        TURNER  1500   0           1500 


4.日期函数
  -Orale是以一种内部的数值形式存储日期的,即:世纪、年、月、日、小时、分、秒
  -默认日期形式是:DD-MON-RR
  -SYSDATE是一个可以返回当前系统日期和时间的函数
  -DUAL是一个虚拟表用于查看SYSDATE
  -对一个日期型数据加上或减去一个数可以得到一个新的日期型数据
  -两个日期型数据相减得到这两个日期的间隔天数
  -如要以小时相加则必须用小时数除以24得到的数据进行相加

 

例:

SELECT ename,(SYSDATE-hiredate)/7 WEEKS
FROM   emp
WHERE  deptno=10;
结果:
        ENAME           WEEKS 
        CLARK         1434.49271 
        KING          1411.49271 
        MILLER        1401.92128 

 

5.RR日期格式
                                   | 如果指定两位数年份是:
                                   |                        0-49                    |           50-99
如果当前年份| 0-49  | 返回日期是当前世纪的日期 | 返回日期是上个世纪的日期
的两位数是:| 50-99| 返回日期是下个世纪的日期 | 返回日期是当前世纪的日期
 
  例:
 
  当前年份           指定的日期          RR格式        YY格式
   1995              27-OCT-95            1995          1995
   1995              27-OCT-17            2017          1917
   2001              27-OCT-17            2017          2017
   2001              27-OCT-95            1995          2095

 

6.日期函数
1)MONTHS_BETWEEN:两个日期之间间隔多少个月


  MONTHS_BETWEEN('01-9月-95','11-9月-94')     
  结果:11.6774194

 

2)ADD_MONTHS:向一个日期数据加一定的月份


  ADD_MONTHS('11-1月-94',6)     
  结果:11-7月 -94

 

3)NEXT_DAY:某个指定日期之后的一周内某天


  NEXT_DAY('01-8月-07',1)     
  结果:05-8月 -07

  注:第二个参数表示下周的第几天,周日是第一天

 

4)LAST_DAY:返回某月的最后一天


  LAST_DAY('01-9月-95')     
  结果:30-9月 -95
 
5)ROUND:对日期进行四舍五入


   ROUND('25-7月-95','MONTH')
  结果:01-8月-95
  ROUND('25-7月-95','YEAR')
  结果:01-1月-96

 

6)TRUNC:对日期进行截取


  TRUNC('25-7月-95','MONTH')
  结果:01-7月-95
  TRUNC('25-7月-95','YEAR')
 结果:01-1月-95

例:

SELECT empno,hiredate,MONTHS_BETWEEN(SYSDATE,hiredate) TENURE,
ADD_MONTHS(hiredate,6) REVIEW,
NEXT_DAY(hiredate,2),LAST_DAY(hiredate)

FROM   emp
WHERE  MONTHS_BETWEEN(SYSDATE,hiredate)<250;

 

7.转换函数
-隐式数据类型转换:

  赋值语句中,oralce服务器自动完成以下转换
        从                         到
  VARCHAR2 or CHAR                NUMBER
  VARCHAR2 or CHAR                DATE
  NUMBER                          VARCHAR2
  DATE                            VARCHAR2

-显式数据类型转换:

1)TO_CHAR用于日期型:TO_CHAR(date,'fmt')
   日期格式模型:
   -必须用单引号引起来
   -可以包含任何有效的日期元素
   -使用逗号与日期型数据分隔开

   日期格式模型的元素:
   YYYY----完整的年份数字表示
   YEAR----年份的英文表示
   MM------用两位数字来表示月份
   MONTH---月份的英文表示
   DY------用3个英文字符所写来表示星期几
   DAY-----星期几完整的英文表示
  
例1:用时间元素格式化日期的时间部分


HH24:MI:SS:AM      15:45:32:PM

 

例2:通过使用双引号可以添加字符串


DD "of" MONTH      12 of 8月

 

例3:

SELECT ename,TO_CHAR(hiredate,'yyyy-mm-dd') HIREDATE
FROM   emp

结果:
         ENAME        HIREDATE 
         SMITH       1980-12-17 
         ALLEN       1981-02-20 

 

2)TO_CHAR用于数值型:TO_CHAR(number,'fmt')


  通过在TO_CHAR中使用以下形式可以把数值型数据转换成变长的字符串
  9------一位数字
  0------显示前导零
  $------显示美元符号
  L------显示本地货币号
  .------显示小数点
  ,------显示千位符

例:

SELECT TO_CHAR(sal,'$99,999') SALARY
FROM   emp
WHERE  ename='SCOTT';
结果:
        SALARY 
        $3,000 

 

3)TO_NUMBER和TO_DATE函数


  -TO_NUMBER将一个字符串转换成数值型数据:TO_NUMBER(char)
  -TO_DATE将一个字符串转换成日期型数据:TO_DATE(char[,'fmt'])

 

8.NVL函数


1)将NULL转换成为一个实际的值
 -数据类型可以是date、character、number


2)数据类型必须匹配
NVL(comm,0)
NVL(hiredate,'01-7月-97')
NVL(job,'No Job Yet')
   
例:

SELECT ename,sal,comm,(sal*12)+NVL(comm,0)
FROM   emp;

结果:
        ENAME     SAL     COMM     (SAL*12)+NVL(COMM,0) 
        SMITH     800                     9600 
        ALLEN     1600     300            19500 
        WARD      1250     500            15500

 

9.DECODE函数


使用DECODE函数更便于完成诸如CASE或IF-THEN-ELSE语句的条件查询:

DECODE(col/expression,search1,result1
                        [,search2,result2,...,]
                        [,default])
例1:
SELECT job,sal,DECODE(job,'ANALYST',SAL*1.1,
                                                        'CLERK',SAL*1.15,
                                                'MANAGER',SAL*1.20,
                                                                       SAL) REVISED_SALARY
FROM    emp;
 

结果:
       JOB         SAL      REVISED_SALARY 
       CLERK       800           920 
       SALESMAN    1250          1250 
       MANAGER     2975          3570 

 

例2:显示部门编号为30的每个雇员相应的税率


SELECT ename,sal,DECODE(TRUNC(sal/1000,0),
                                                                        0,0.00,
                                                                        1,0.09,
                                                                        2,0.20,
                                                                        3,0.30,
                                                                        4,0.40,
                                                                        5,0.42,
                                                                        6,0.44,
                                                                           0.45) TAX_RATE
FROM    emp
WHERE   deptno=30;
 

结果:
        ENAME      SAL      TAX_RATE 
        ALLEN      1600      .09 
        WARD       1250      .09 
        MARTIN     1250      .09 
        BLAKE      2850      .2 
        TURNER     1500      .09 
        JAMES      950        0 

 

10.函数的嵌套:
 例:
      SELECT ename, NVL(TO_CHAR(mgr),'No Manager')                      
      FROM    emp
      WHERE   mgr IS NULL;
   结果:
        ENAME       NVL(TO_CHAR(MGR),'NOMANAGER') 
        KING                 No Manager 

 


练习
1.查询并显示雇员名。要求首字母大写,其他字母小写,显示名字的长度,只选择雇员名开始字母是J、A或M的雇员。用雇员名排序结果
 
   SELECT INITCAP(ename),LENGTH(ename)
   FROM   emp
   WHERE  ename LIKE 'J%'
   OR     ename LIKE 'A%'
   OR     ename LIKE 'M%';

2.查询所有雇员名和薪水。薪水格式化为15个字符长度,用$左填充,列标签SALARY
  
   SELECT ename,LPAD(sal,15,'$') SALARY
   FROM   emp

3.显示姓名以N结尾的雇员
   SELECT *
   FROM   emp
   WHERE  UPPER(ename) LIKE '%N';

4.查询当前日期,列标题显示为Date

   SELECT TO_CHAR(SYSDATE,'DD-MONTH-YYYY') "Date"
   FROM   dual;

5.对每一个雇员,显示其名字,并计算从雇员受雇日期到今天的月数,列标签MONTHS_WORKED。按受雇月数排序结果,四舍五入月数到最靠近的整数月

   SELECT ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) MONTHS_WORKED
   FROM   emp;

6.查询雇员名和佣金。若雇员没有佣金,显示"No Commission",列标签COMM
 
  SELECT ename,decode(comm,
                           NULL,'No Commission',
                                           comm) COMM
  FROM   emp;
 
  或:
  SELECT ename,NVL(to_char(comm),'No Commission') COMM
  FROM   emp;
 
7.显示雇员雇佣期满6个月后下一个星期五的日期。显示格式如02-4-1982,并按雇佣日期排序

  SELECT   TO_CHAR(NEXT_DAY(ADD_MONTHS(hiredate,6),6),'DD-Month-YYYY')
  FROM     emp
  ORDER BY hiredate;

posted @ 2010-01-06 17:35  依然神思者  阅读(574)  评论(0编辑  收藏  举报